import { fileURLToPath, URL } from 'node:url'

import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import inspect from 'vite-plugin-inspect';
import { visualizer } from 'rollup-plugin-visualizer'; // 打包分析
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; // svg-icon

import components from 'unplugin-vue-components/vite';
import { AntDesignXVueResolver } from 'ant-design-x-vue/resolver';

// https://vite.dev/config/
export default defineConfig(({mode}) => {
  // 根据当前工作目录中的 `mode` 加载 .env 文件
  // 设置第三个参数为 '' 来加载所有环境变量，而不管是否有 `VITE_` 前缀。
  const env = loadEnv(mode, process.cwd(), '')
  const isProduction = env.NODE_ENV === 'production'
  const viteVisualizer = env.VITE_VISUALIZER === 'true'
  console.log('env:', isProduction, viteVisualizer);

  const plugins = [
    vue(),
    vueJsx(),
    inspect(),
    createSvgIconsPlugin({
      // 指定需要缓存的图标文件夹
      iconDirs: [fileURLToPath(new URL('./src/assets/svg', import.meta.url))],
      // 指定symbolId格式
      symbolId: 'icon-[dir]-[name]',
      customDomId: '__mh__svg__icons__dom__'
    }),
    components({
      resolvers: [
        AntDesignXVueResolver()
      ]
    })
  ]

  if(isProduction && viteVisualizer) {
    plugins.push(
      visualizer({
        gzipSize: true,
        brotliSize: true,
        emitFile: false,
        // 分析图生成的文件名
        filename: 'build-report.html',
        // 如果存在本地服务端口，将在打包后自动展示
        open: true,
      })
    )
  }

  return {
    plugins,
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url))
      },
    },
    server: {
      port: 9696,
      host: true
    },
    build: {
      sourcemap: !isProduction, // 这个生产环境一定要关闭，不然打包的产物会很大
      reportCompressedSize: false, // 关闭文件计算
      cssCodeSplit: true,
      rollupOptions: {
        output: {
          chunkFileNames: 'static/js/[name]-[hash].js',
          entryFileNames: 'static/js/[name]-[hash].js',
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
        },
      },
      terserOptions: {
        compress: {
          drop_console: isProduction,
          drop_debugger: isProduction
        }
      }
    }
  }
})
